import Column from '@model/types/Column'
import Vue, { CreateElement, VNode, VueConstructor } from 'vue'

export interface FieldComponent {
  setting: VueConstructor<Vue>,
  preview: VueConstructor<Vue>,
  build: VueConstructor<Vue>,
  view?: VueConstructor<Vue>,
  extend?: {
    [componentKey: string]: VueConstructor<Vue>
  }
}

interface Field {
  isBalanceField?: boolean;
  /**
   * 字段ID
   */
  fieldId?: string
  fixed?: boolean | 'left' | 'right'
  /**
   * @des 是否固定
   */
  fixLeft?: Boolean | string,
  
  // 租户id
  tenantId?: string
  
  // 表名
  tableName?: string
  
  /**
   * 是否系统字段
  */
  isSystem?: number
  
  /**
   * 字段名称
  */
  fieldName: string
  
  /**
   * 显示名称
  */
  displayName?: string 
  
  /**
   * 表单显示类型
   * 数据类型: label标签 text 单行文本 textarea 多行文本 editor 编辑器 box 选项 datetime 日期 number 数字 user员工email邮箱phone手机号mobile电话
  */
  formType?: string
  
  /**
   * 默认值
  */
  defaultValue?: string | null
  
  /**
   * 默认值语言
  */
   defaultValueLanguage?: any
  
  /**
   * 是否允许为空
   * 0: 必填 1: 非必填
  */
  isNull?: number
  
  /**
   * 是否表单验证
  */
  isValidate?: number
  
  /**
   * 是否 用于搜索
  */
  isSearch?: number
  
  /**
   * 是否添加数据时显示
  */
  isAdd?: number
  /**
   * 是否逻辑删除
  */
  isDelete?: number
  
  /**
   * 是否只读
  */
  isReadonly?: number
  
  /**
   * 输入提示信息
  */
  placeHolder?: string | null 
  
  /**
   * 表内排序
  */
  orderId?: number | null
  
  /**
   * table中文名称
  */
  tableChsName?: string 
  
  /* 是否是实例数据 */
  isGuideData?: boolean
  
  /* 用户向导有关的 */
  guideProfessions?: any[]
  
  // 自增Id
  iid?: string
  
  id?: string | number
  
  /**
   * 设置信息，保存预制列表等数据
  */
  setting?: {
    limit?: number;
    fieldName?: string,
    // 客户名称是否允许重复
    customerNameDuplicate?: boolean
    // 客户配置项
    customerOption?: {
      // 地址是否开启
      address?: boolean,
      // 联系人是否开启
      linkman?: boolean,
      // 产品是否开启
      product?: boolean,
      // 地址是否不为空(必填)
      addressNotNull?: boolean,
      // 联系人是否不为空(必填)
      linkmanNotNull?: boolean,
      // 产品是否不为空(必填)
      productNotNull?: boolean,
    }
    // 下拉列表
    dataSource?: Array<string | Record<string, any>>
    // 是否为多选
    isMulti?: boolean
    // 下拉菜单模式 1：下拉模式 2：平铺模式 null: 下拉模式
    selectType?: 1 | 2 | null
    // 可见性配置
    visibleConfig?: {
      // 是否显示可见性
      visible?: 1 | 0,
      // 可见性权限角色ids
      role?: string[]
    },
    isFreeServiceFee?: boolean
    isFreeSparePartFee?: boolean
    isFreeMaterialFee?:boolean
    defaultQuality?: string
    limitConig?: Record<string, any>
    defaultValueConfig?: Record<string, any>
    dateType?: string
    dependencies?: Record<string, string[]>
    isShuKun?: boolean
    sync?: boolean
  }
  limitConig?: Record<string, any>
  
  /** 
   * 是否启用
  */
  enabled?: number
  // 分组字段列表
  groupFields?: Field[]
  
  /* ------ 以下是前端用的 ------- */
  
  /**
   * 字段名称
  */
  field?: string
  
  /* -------- 以下字段是前端使用的 --------- */
  // 导出分组用的
  group?: string
  label?: string
  // 导出别名
  exportAlias?: string
  // 是否导出 用于导出组件
  export?: boolean
  // 选择列使用的
  name?: string 
  // 表格列是否显示
  show?: boolean
  // 喵喵喵
  map?: any
  // 最小宽度
  minWidth?: string | null
  // 宽
  width?: string | null | number
  // 最大长度
  maxlength?: string | null | number
  // 是否显示 (不知道啥玩意)
  isVisible?: boolean
  // 是否隐藏 (不知道啥玩意)
  isHidden?: number
  // 表单组件
  component?: FieldComponent
  // 渲染方法
  render?: (h: CreateElement, data: any, instance: Vue) => VNode | string
  renderCell?: (h: CreateElement, column: Column, row: any, instance: Vue) => VNode | string
  renderHeader?: (h: CreateElement, column: Column, instance: Vue) => VNode | string
}

export default Field
